package jp.co.toshiba.ffsa.service.csde;

import java.sql.Timestamp;
import java.util.Calendar;

import jp.co.toshiba.ffsa.entity.Project;
import jp.co.toshiba.ffsa.entity.User;
import jp.co.toshiba.ffsa.entity.Workflow;
import jp.co.toshiba.ffsa.mail.SendMaiMail;
import jp.co.toshiba.ffsa.service.common.CommonService;
import jp.co.toshiba.ffsa.service.common.ConstantValue;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.mai.mail.MailAddress;
import org.seasar.struts.util.MessageResourcesUtil;

import com.ozacc.mail.MailSendException;

/**
 * ES出荷確認画面 サービスクラス
 * @author npc
 */
public class Csde701Service {

    /** ユーザーID */
    protected String userID;
    /** プロジェクトID */
    protected String projectId;
    /** ワークフローID */
    protected String workflowId;
    /** ユーザーマスタ */
    private User user;
    /** メールアドレス */
    public String emailAddress;
    /** エラーコード */
    public String errorCode;
    /** プロジェクト名 */
    public String projectName;

    /**
     * userIDをセットする
     * @param userID
     */
    public void setUserID(String userID){this.userID = userID;}

    /**
     * projectIdをセットする
     * @param projectId
     */
    public void setProjectId(String projectId){this.projectId = projectId;}

    /**
     * workflowIdをセットする
     * @param workflowId
     */
    public void setWorkflowId(String workflowId){this.workflowId = workflowId;}

    /**
     * ワークフロー情報を取得する
     * @return ワークフロー情報
     * @throws Exception
     */
    public Workflow getWorkflowInfo() throws Exception {

           // S2Container初期化
           SingletonS2ContainerFactory.init();

           // S2ContainerからJdbcManagerを取得
           JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

           // 検索条件
           SimpleWhere swh = new SimpleWhere().eq("projectId",  projectId)
                                              .eq("revision",   ConstantValue.preparation)
                                              .eq("workflowId", ConstantValue.es)
                                              ;
           // 情報取得
           Workflow workflow = jdbcManager.from(Workflow.class)
                                  .where(swh)
                                  .getSingleResult()
                                  ;
           return workflow;
    }

    /**
     * プロジェクト情報を取得する
     * @return プロジェクト情報
     * @throws Exception
     */
    public Project getProjectInfo() throws Exception {

           // S2Container初期化
           SingletonS2ContainerFactory.init();

           // S2ContainerからJdbcManagerを取得
           JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

           // 検索条件
           SimpleWhere swh = new SimpleWhere().eq("projectId", projectId);

           // 情報取得
           Project project = jdbcManager.from(Project.class)
                                        .where(swh)
                                        .getSingleResult()
                                        ;
           return project;
    }

    /**
     * ES出荷確認ステータスの更新を行い、更新件数を取得する
     * @return 更新件数
     * @throws Exception
     */
    public int UpdateEsStatus() throws Exception {

           // S2Container初期化
           SingletonS2ContainerFactory.init();

           // S2ContainerからJdbcManagerを取得
           JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);

           // 現在日時取得
           Calendar cal = Calendar.getInstance();
           Timestamp updatedAt = new Timestamp(cal.getTime().getTime());

           // プロジェクト情報を取得する
           Project project = getProjectInfo();

           // 値をセットする
           project.esStatus  = 2;
           project.updatedAt = updatedAt;
           project.updatedBy = userID;

           // 更新処理(件数を取得)
           int updateCount = jdbcManager.update(project).includes( "esStatus"
                                                                 , "updatedAt"
                                                                 , "updatedBy"
                                                                 ).execute()
                                                                 ;
           return updateCount;
    }

    /**
     * メール送信処理
     * ES受領確認メール
     * @return 処理結果
     * @throws Exception エラー
     */
    public Boolean mailSend( ) throws Exception {
        boolean successFlag = false;
        try {
            // 顧客情報取得
            getUser();

            // メール情報をセット
            SendMaiMail sendMaiMail = new SendMaiMail();

            // 送信元メールアドレス(From)
            sendMaiMail.setMailAddressFrom(MessageResourcesUtil.getMessage("mail_address_from"));

            // 送信先メールアドレス(To)
            CommonService commonService = new CommonService();
            MailAddress[] sendMailAddressTo = commonService.getAdministratorAndSuperUserMailaddress(user.region);
            sendMaiMail.setMailAddressTo(sendMailAddressTo);

            // 置き換え文字列
            sendMaiMail.setReplacementItem1(user.mailAddress);
            sendMaiMail.setReplacementItem2(projectName);
            sendMaiMail.setReplacementSubject("");

            // ES受領確認メール送信
            successFlag = sendMaiMail.sendMail(ConstantValue.updESCheck);

            if(!successFlag){
                errorCode = "csde701.900";
                return false;
            }

        }catch(MailSendException m){
            return false;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        return true;
    }

    /**
     * ユーザー情報取得処理
     * @throws Exception
     */
    public User getUser() throws Exception{

        // S2Container初期化
        SingletonS2ContainerFactory.init();

        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // 検索条件
            SimpleWhere swh = new SimpleWhere().eq("userID", userID)
                                               .eq("deleteFlag", ConstantValue.deleteFlagEnabled);

            // 一覧取得
            user= jdbcManager.from(User.class)
                             .where(swh)
                             .getSingleResult()
                             ;
            if(user != null){
                emailAddress = user.mailAddress;
            }
        }catch(Exception e){
            throw e;
        }
        return user;
    }

}